#include <iostream>
#include <memory>

class Entity
{
public:
    int x, y;

public:
    Entity(int value) : x(value), y(value) {}
};

void Print(const Entity* e)
{
    std::cout << e->x << ", " << e->y << std::endl;
}

int main()
{
    // unique_ptr 最简单的智能指针，在对象生命周期结束时自动释放内存，但是无法复制
    std::unique_ptr<Entity> e = std::make_unique<Entity>(1);



    // shared_ptr 在为对象分配内存的同时，为控制块分配内存，记录引用的次数,可以复制，每次复制引用计数器+1;每个引用生命周期到了之后计数器-1
    // 当引用计数器归零时销毁对象；
    std::shared_ptr<Entity> e1 = std::make_shared<Entity>(1);
    Print(e.get());

    // weak_ptr 将shared_ptr 对象赋给weak_ptr 时不会增加引用计数器；
    std::weak_ptr<Entity> e3 = e1;
}